#include <stdio.h>
#include <stdlib.h>

// 命令常量
enum {
    CMD_QUIT,   // 退出
    CMD_READ,   // 读取
    CMD_SAVE,   // 保存
    CMD_PRINT,  // 打印
    CMD_QUERY,  // 查询
    CMD_INSERT, // 添加
    CMD_UPDATE, // 修改
    CMD_DELETE, // 删除
    CMD_SORT,   // 排序
    CMD_CHART,  // 图表
};

// 函数声明
void init(void);         // 程序启动
void quit(void);         // 程序退出
void display_menu(void); // 显示命令菜单
int make_choice(void);   // 选择命令
int confirm(const char* msg);

void read_data(void);    // 读取
void save_data(void);    // 保存
void print_data(void);   // 打印
void query_data(void);   // 查询
void add_data(void);     // 添加
void update_data(void);  // 修改
void delete_data(void);  // 删除
void sort_data(void);    // 排序
void make_chart(void);   // 图表

// 主程序
int main(void)
{
    init();
    for (;;) {
        display_menu();
        int c = make_choice();
        switch (c) {
        case CMD_READ:
            read_data();
            break;
        case CMD_SAVE:
            save_data();
            break;
        case CMD_PRINT:
            print_data();
            break;
        case CMD_QUERY:
            query_data();
            break;
        case CMD_INSERT:
            add_data();
            break;
        case CMD_UPDATE:
            update_data();
            break;
        case CMD_DELETE:
            delete_data();
            break;
        case CMD_SORT:
            sort_data();
            break;
        case CMD_CHART:
            make_chart();
            break;
        case CMD_QUIT:
            if (confirm("确定要退出吗？")) quit();
            break;
        default:
            printf("命令错误，请重新选择\n");
        }
    }
    return 0;
}

void init(void)
{
    puts("库存管理系统启动");
}

void quit(void)
{
    puts("程序退出");
    exit(EXIT_SUCCESS);
}

void display_menu(void)
{
    printf("\n%d 读取 | %d 保存 | %d 打印 | %d 查询 | %d 添加\n"
           "%d 修改 | %d 删除 | %d 排序 | %d 图表 | %d 退出\n\n",
        CMD_READ, CMD_SAVE, CMD_PRINT, CMD_QUERY, CMD_INSERT,
        CMD_UPDATE, CMD_DELETE, CMD_SORT, CMD_CHART, CMD_QUIT);
}

int make_choice(void)
{
    int choice;
    int ok = 0;

    while (!ok) {
        printf("请选择：");
        ok = scanf("%d", &choice);
        scanf("%*[^\n]");
    }

    return choice;
}

int confirm(const char* msg)
{
    char c = 'n';
    printf("%s(Y/N): ", msg);
    scanf(" %c%*[^\n]", &c);
    return c == 'y' || c == 'Y';
}

// 零件库存储结构
#define NAME_LEN 31
#define MAX_PARTS 100

struct part {
    int number;
    char name[NAME_LEN + 1];
    int on_hand;
};

static struct part inventory[MAX_PARTS];
static int num_parts = 0;


int find_part(int part_number)
{
    for (int i = 0; i < num_parts; i++)
        if (inventory[i].number == part_number)
            return i;

    return -1; // not found
}

void query_data(void)
{
    puts("查询");

    int number;
    printf("输入零件编号：");
    scanf("%d", &number);

    int i = find_part(number);
    if (i >= 0) {
        printf("零件编号：%d\n", inventory[i].number);
        printf("零件名称：%s\n", inventory[i].name);
        printf("库存数量：%d\n", inventory[i].on_hand);
    } else {
        puts("没有找到该零件");
    }
    getchar();

    return;
}

void add_data(void)
{
    puts("添加");
    getchar();
    if (num_parts == MAX_PARTS) {
        puts("零件库已满");
        return;
    }
    printf("输入零件编号：");
    scanf("%d", &inventory[num_parts].number);
    printf("输入零件名称：");
    scanf("%s", inventory[num_parts].name);
    printf("输入库存数量：");
    scanf("%d", &inventory[num_parts].on_hand);
    num_parts++;
    getchar();
    puts("添加成功");

    return;
}

void update_data(void)
{
    puts("更新");
    getchar();
    int number;
    printf("输入零件编号：");
    scanf("%d", &number);

    int i = find_part(number);
    if (i >= 0) {
        printf("零件编号：%d\n", inventory[i].number);
        printf("零件名称：%s\n", inventory[i].name);
        printf("库存数量：%d\n", inventory[i].on_hand);
        printf("输入新的库存数量：");
        scanf("%d", &inventory[i].on_hand);
        puts("更新成功");
    }

    else {
        puts("没有此零件");
    }
    return;
}

void delete_data(void)
{
    char name[NAME_LEN + 1];  // 添加临时缓冲区
    char choice[2];          // 用于存储继续选项
    
    puts("删除");
    puts("输入零件名称：");
    gets(name);
    int i;
    for (i = 0; i < num_parts; i++) {  // 应该使用num_parts而不是固定值10
        if (strcmp(inventory[i].name, name) == 0) {
            break;
        }
    }
    if (i < num_parts) {
        for (; i < num_parts - 1; i++) {  // 修正循环条件
            strcpy(inventory[i].name, inventory[i + 1].name);
            inventory[i].on_hand = inventory[i + 1].on_hand;
            inventory[i].number = inventory[i + 1].number;
        }
        num_parts--;  // 减少零件计数
        puts("删除成功");
    }
    else {
        puts("没有此零件");
    }
    puts("继续吗？");
    gets(choice);  // 使用choice变量而不是name
    if (strcmp(choice, "y") == 0) {
        delete_data();  // 修正递归调用(原代码中是delete_item())
    }
    return;
}

void read_data(void)
{
    puts("读取");
    for (int i = 0; i < num_parts; i++) {
        printf("%s %d %.2f\n", inventory[i].name, inventory[i].number, inventory[i].on_hand);
    }
    puts("按回车键继续...");
    getchar();
    main_menu();
    return;
}

void save_data(void)
{
    puts("保存");
    FILE *fp = fopen("data.txt", "w");
    for (int i = 0; i < num_parts; i++) {
        fprintf(fp, "%s %d %.2f\n", inventory[i].name, inventory[i].number, inventory[i].on_hand);
    }
    fclose(fp);
    puts("保存成功！");
    puts("按回车键继续...");
    getchar();
    main_menu();
    return;
}

void print_data(void)
{
    puts("打印");
    for (int i = 0; i < num_parts; i++) {
        printf("%s %d %.2f\n", inventory[i].name, inventory[i].number, inventory[i].on_hand);
    }
    puts("按回车键继续...");
    getchar();
    main_menu();
    return;
}

void sort_data(void)
{
    puts("排序");
    for (int i = 0; i < num_parts; i++) {
        for (int j = i + 1; j < num_parts; j++) {
            if (strcmp(inventory[i].name, inventory[j].name) > 0) {
                struct part t = inventory[i];
                inventory[i] = inventory[j];
                inventory[j] = t;
            }
        }
    }
    main_menu();
    return;
}

void make_chart(void)
{
    puts("图表");
    puts("编号\\名称\t数量");
    for (int i = 0; i < num_parts; i++) {
        printf("%d\\%s\t%d\n",inventory[i].number, inventory[i].name, inventory[i].on_hand);
    }
    main_menu();
    return;
}
